package com.xxxx.ssm;

import com.xxxx.ssm.exception.BusinessException;
import com.xxxx.ssm.exception.ParamsException;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 总结
 * 这里自定义了一个异常类  GlobalExceptionResolver 实现了自定义异常的方法
 * 并且将这个异常类交给spring 的  IOC 容器进行处理
 * 也就是说这个异常类的实例化对象已经存在在容器中
 * 当发生对应的异常的时候 就会触发容器中的此异常类并且调用里面的方法
 * 从而显示对应的结果
 */

//@Component
public class GlobalExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
       ModelAndView mv = new ModelAndView("error");
       mv.addObject("ex" , "默认的错误信息.");
       //自定义异常
        if(e instanceof ParamsException){
            //设置参数异常的页面
            mv.setViewName("params_error");
            //将异常的类型进行转换
            ParamsException ee = (ParamsException) e;
            mv.addObject("ex" , ee.getMsg());
        }

        if(e instanceof BusinessException){
            //设置参数异常的页面
            mv.setViewName("business_error");
            //类型向下转型
            BusinessException ee = (BusinessException) e;
            mv.addObject("ex" , ee.getMsg());
        }

        //处理JSON格式
        /**
         * 判断handler返回的额类型   视图JSON
         * 这里需要返回null
         * 还是要进行学习 对于没有接触过的东西   你不去学习 你永远不会知道
         * 也不会天生自然而然的就会了
         * 你想要成为大牛  想要混的更好  想要吃饭的家伙更好
         * 那么你就应该好好的学 一个知识点一个知识点 扎实的过
         * 好好的学习  好好的做项目
         * 多积累
         * 才会成为大牛
         *
         */
        try {
            httpServletResponse.getWriter().write("json");
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
        return mv;
    }
}
